线程间通信
1. 同步
同步(synchronization)指的是多个任务按照约定的先后次序相互配合完成一件事情。
由信号量来决定线程是继续运行还是阻塞等待
信号量只能通过三种操作来访问:
- 初始化
- P操作(申请资源):任务要去访问一个资源,它不知道系统中有没有这个资源,所以他要向系统去申请代表这个资源的一个信号量。如果要申请的信号量有值资源那么就可以申请到继续运行,如果要申请的信号量没有值资源,那么就要阻塞等待这个信号量有值。
- V操作(释放资源):当任务不需要访问资源了或者任务产生了一个资源,这时就需要进行V操作。通知系统资源数增加了,系统就会去唤醒等待这个资源的任务。
信号量 -P / V操作
P(S)含义如下:
if (信号量的值大于0) // 操作系统检查
{
//申请资源的任务继续运行;
//信号量的值减一;
}
else
{
//申请资源的任务阻塞;
}V(S)含义如下:
信号量的值加一;
if (有任务在等待资源) // 操作系统检查
{
//唤醒等待的任务,让其继续运行;
}在申请信号量的时候有任务有可能被阻塞,在释放信号量的时候绝对不会有任务因此阻塞。
Posix信号量
- 无名信号量(基于内存的信号量),只存在与内存,一般用于线程通信间。
- 有名信号量,应该在硬盘里面会对应有一个文件,用于进程通信间。
pthread库常用的信号量操作函数如下:
1 | int sem_init(sem_t *sem, int pshared, unsigned int value); |
信号量初始化:
1 |
|
信号量 - P / V操作:
1 |
|
线程同步 - 示例1
1. 两个线程同步读写缓冲区(生产者/消费者问题)

代码:
1 | char buf[32]; |
2. 更加严谨的同步读写缓冲区

代码:
1 | char buf[32]; |
小结
- 信号量是和系统中一个共享资源的一个操作绑定的,用于指示该资源此时是否可以进行此种操作。
- P操作:获取信号量,V操作:释放信号量。
- 当一个线程申请一个为0的信号量是,该线程会被阻塞(被添加到该信号量的延时列表)。
- 当系统中某个信号量被释放时,系统会删除该信号量延时列表的第一个节点,唤醒因等待该信号量被阻塞的最高优先级的那个线程。
信号量释放规则:
信号量获取规则:
- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/37.线程间通信 - 同步 - 信号量/